import random
import logging

from django.http import HttpResponse
from django.shortcuts import render
from django_redis import get_redis_connection

from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response

from meiduo_mall.libs.captcha.captcha import captcha
from meiduo_mall.libs.yuntongxun.sms import CCP
from meiduo_mall.utils import constants
from celery_tasks.sms.tasks import send_sms_code
from .serializers import ImageCodeCheckSerializer

# Create your views here.

class SMSCodeView(GenericAPIView):
    # 图片验证码序列化器
    """
    接收参数  mobile、image—code-id、text
    校验参数：image-code-id，text
    对比text和服务器储存的图片验证码内容
    """
    # 序列化器校验传入的参数
    serializer_class = ImageCodeCheckSerializer


    def get(self,request,mobile):

        #创建序列化器对象
        serializer = self.get_serializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)
        # 生成短信验证码
        sms_code = '%06d' % random.randint(0,999999)
        logging.info(sms_code)


        # 发送短信验证码
        # CCP().send_template_sms(mobile,[sms_code,constants.SME_CODE_REDIS_EXPRIES // 60],1)
        # 使用celery异步发送短息
        # dekay : 将延时任务添加到任务队列，并触发异步任务，让worker可以观察到
        send_sms_code.delay(mobile,sms_code)
        logging.error(sms_code)
        # 创建redis对象
        redis_conn = get_redis_connection('verify_codes')

        # 保存短信验证码
        # redis_conn.setex('sms_%s' % mobile, constants.SME_CODE_REDIS_EXPRIES, sms_code)

        #储存是否在60秒内重发发送短信的标记
        # redis_conn.set('sms_%s' % mobile,1,constants.SEND_SMS_REDIS_INTERVAL)
        # send_sms_code(mobile,[sms_code,constants.SME_CODE_REDIS_EXPRIES // 60])

        # 使用管道，让redis的多个指令只需要一次访问redis数据库，就可以执行多个命令 -- pipeline
        # 创建redis管道对象
        pl = redis_conn.pipeline()
        # 储存短信验证码
        pl.set('sms_%s' % mobile,sms_code,constants.SME_CODE_REDIS_EXPRIES)

        pl.setex('send_flag_%s' % mobile,constants.SEND_SMS_REDIS_INTERVAL,1)
        # 注意：  pipeline要使用execute（）执行
        pl.execute()

        return Response({'message':'OK'})


class ImageCodeView(APIView):
    """
    图片验证码
    """
    def get(self,request,image_code_id):
        """获取图片验证码"""
        text, image = captcha.generate_captcha()
        logging.error(text)

        redis_conn = get_redis_connection('verify_codes')

        redis_conn.set("img_%s" % image_code_id,text,constants.IMAGE_CODE_REDIS_EXPIRES)
        # 固定返回验证码图片数据，不需要rest framework框架的Response帮助我们决定返回响应数据的格式
        # 所以此处直接使用django原生的HttpResponse即可

        return HttpResponse(image,content_type='image/jpg')